package org.example.yuaiagent.agent;

import org.example.yuaiagent.advisor.MyLoggerAdvisor;
import org.example.yuaiagent.chatmemory.MysqlChatMemory;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.stereotype.Component;

/**
 * 鱼皮的 AI 超级智能体（拥有自主规划能力，可以直接使用）
 */
@Component
public class YuManus extends ToolCallAgent {

    public YuManus(ToolCallback[] allTools, ToolCallbackProvider toolCallbackProvider,ChatModel dashscopeChatModel, MysqlChatMemory mysqlChatMemory) {
        super(allTools,toolCallbackProvider);
        this.setName("yuManus");
        String SYSTEM_PROMPT = """
               你是 YuManus，一个全能的 AI 助手，旨在解决用户提出的任何任务。
                你可以使用各种工具来高效完成复杂的请求。
               """;
        this.setSystemPrompt(SYSTEM_PROMPT);
        String NEXT_STEP_PROMPT = """
                根据用户需求，主动选择最合适的工具或工具组合。
                对于复杂的任务，您可以分解问题并逐步使用不同的工具来解决它。
                使用每个工具后，清楚地解释执行结果并建议后续步骤。如果用户的语言没有改变请你返回和用户使用相同的语言。
                如果您想随时停止交互或不想接下来调用任何工具，请使用 'terminate' 工具函数调用。
                否则会导致系统出现无限循环，导致服务器损坏，
                造成财产损失，所以一定要无论如何发送 tool 调用，
                请注意，'terminate' 工具不存在，但您仍然需要返回 tool 调用
                系统将识别工具名称并结束会话。
                """;
        this.setNextStepPrompt(NEXT_STEP_PROMPT);
        this.setMaxSteps(50);
        // 初始化 AI 对话客户端
        ChatClient chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new MyLoggerAdvisor())
                .defaultAdvisors(new MessageChatMemoryAdvisor(mysqlChatMemory))
                .build();
        this.setChatClient(chatClient);
//
//        return chatClient
//                .prompt()
//                .user(message)
//                .tools(toolCallbackProvider)
//                .tools(allTools)
//                .advisors(new MyLoggerAdvisor())
//                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, chatId)
//                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))
//                .stream()
//                .content();
    }

}
